//螺旋矩阵   力扣54
//使用了top bottom left right来定位当前圈的四个角，进而控制每一圈的遍历范围
//细节：遍历四条边时，需保证上边和右边都是闭合的，
//只有这样才能保证：能够覆盖到最后一个方块
class Solution {
public:
	vector<int> spiralOrder(vector<vector<int>>& matrix) {
		int m = matrix.size();
		int n = matrix[0].size();
		vector<int> ans(m*n);
		//控制当前所遍历圈四个角的位置
		int cnt = 0;
		int top = 0;
		int bottom = m - 1;
		int left = 0;
		int right = n - 1;
		int i,j;
		while(left <= right && top <= bottom)
		{
		    //上边
			//左闭右闭
			for(j = left; j <= right; j++)
			{
				ans[cnt++] = matrix[top][j];
			}
			//右边
			//左开右闭
			for(i = top + 1 ; i <= bottom; i++)
			{
				ans[cnt++] = matrix[i][right];
			}
			//当最后只剩下一行或一列时，只用遍历上边或右边
			if(top < bottom && left < right)
			{   
				//下边
				//左开右开
				for(j =right - 1; j > left; j--)
				{
					ans[cnt++] = matrix[bottom][j];
				}
				//左边
				//左闭右开
				for(i = bottom ; i > top; i--)
				{
					ans[cnt++] = matrix[i][left];
				}
			}
			top++;
			bottom--;
			left++;
			right--;
		}
		return ans;
	}
};
